跳到主要内容

18 WDT 看门狗定时器实验

在这里插入图片描述

开发板官网https://www.edevkit.com/)

本系列教程目录:


WDT 看门狗定时器实验

本章目标:

  • 了解 RA6M5 处理器的看门狗定时器及其工作原理;
  • 学会使用 RASC 配置看门狗定时器、API 函数;

硬件设计

(略,参见配套硬件原理图)

软件设计

新建工程

复制一份“04 GPIO_led”修改文件夹名“18 WDT”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 wdt.cwdt.h,保存到目录下的 src 文件夹下。

FSP 配置

Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。

添加 WDT Stack 模块。

插图01

设置 WDT 属性

插图02

设置 WDT 的启动方式

插图03

  • Start Mode Select:WDT 启动模式选择
  • Timeout Period:WDT 计数周期值
  • Clock Frequency Division Ratio:WDT 时钟分频系数(4/64/128/512/2048/8192)
  • Window End Position:窗口监测结束位置,默认 0%,没有结束位置
  • Window Start Position:窗口监测开始位置,默认 100%,没有开始位置
  • Reset Interrupt Request:选择触发复位的中断请求(NMI 或 Reset)
  • Stop Control:停止对 WDT 控制的条件

PCLKB 时钟 50 MHz,设置分频 8192,设置循环周期 16384,则看门狗频率 50 MHz / 8192 ≈ 6.103 kHz,周期时间 1 / 6.103 kHz ≈ 163.85 μs,最大超时时间 163.85 μs × 16384 ≈ 2.68 s。

配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击“Generate Project Content”按钮,让软件自动生成配置代码即可。

程序设计

开启看门狗功能,看门狗配置的最大喂狗时间是 2.68 秒,程序初始化后亮灯 3 秒后,在循环中每 0.5 秒翻转 LED 快闪代表程序正常运行,每隔 1 秒喂狗操作,计数喂狗十次后也就是 10 秒后停止喂狗,进入 NMI 中断软件重启程序,观察现象。

  1. 打开 WDT 设备
R_WDT_Open(wdt_ctrl_t * const p_ctrl, wdt_cfg_t const * const p_cfg);
  1. 刷新 WDT,也就是喂狗操作
R_WDT_Refresh(wdt_ctrl_t * const p_ctrl);

此函数会更新 WDT 的 14 位计数器,让它从初始值开始递减;

  1. WDT NMI 中断
void wdt_NMI_callback (wdt_callback_args_t * p_args)

当喂狗超时后会进入中断,一般代表程序出现问题卡死,跑飞等,执行软件重启操作重启设备。

程序编写

wdt.h 头文件里定义初始化函数、喂狗函数。

#ifndef BSP_WDT_H_
#define BSP_WDT_H_

#include "hal_data.h"

void wdt_Init(void);
void wdt_FeedDog(void);

#endif

wdt.c 里实现初始化函数、中断函数和喂狗函数。

#include "wdt.h"

//初始化
void wdt_Init(void)
{
//如果使用J-Link调试器进行调试的话需要加上这一句话
//R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0;

//打开WDT设备
R_WDT_Open(&g_wdt0_ctrl, &g_wdt0_cfg);

//刷新一次喂狗
R_WDT_Refresh(&g_wdt0_ctrl);
}

//喂狗
void wdt_FeedDog(void)
{
R_WDT_Refresh(&g_wdt0_ctrl);
}

// NMI中断回调
void wdt_NMI_callback(wdt_callback_args_t * p_args)
{
(void) p_args;

//软件复位MCU
__NVIC_SystemReset();
}

hal_entry.c 文件中添加头文件 wdt.h,在 hal_entry 入口函数初始化 WDT。

uint16_t feedCnt = 0;
void hal_entry(void)
{
/* TODO: add your own code here */

led_Init();
key_Init();

//开机led亮3秒
LED1_ON();
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);
//开启看门狗
wdt_Init();

while(1)
{
LED1_TOGGLE();
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);

feedCnt++;
if(feedCnt % 2 == 0 && feedCnt < 20)
{
//每秒喂狗,执行10次后不再喂狗
//10s后,则会进入NMI中断重启程序
wdt_FeedDog();
}
else if(feedCnt > 30)
{
feedCnt = 0;
}
}


#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

下载验证

连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完成后,观察实验结果。

开机 LED 灯会亮 3 秒,进入循环后 LED 每 500 ms 翻转,在 10 秒之后程序重启重复操作:LED 先亮 3 秒,进入循环 500 ms 翻转。

前 10 秒在循环中每秒会喂狗,程序正常运行,10 秒后停止喂狗会进入 NMI 中断,中断中执行软件重启。